МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
Національний університет «Львівська політехніка»
Кафедра САПР
Звіт
Про виконання лабораторної роботи №3
З курсу:
«Бази даних»
Тема: ІНДЕКСНО-ПОСЛІДОВНИЙ МЕТОД ДОСТУПУ ДО ФАЙЛІВ НА ЗОВНІШНІХ ЗАПАМ’ЯТОВУЮЧИХ ПРИСТРОЯХ.
Мета: Розглянути органiзацiю i ведення файлiв iндексно-послiдовного доступу; набути практичнi навички у програмуваннi алгоритмiв iндексно-послiдовного доступу до файлiв на зовнiшнiх запам'ятовуючих пристроях.
Текст програми:
#include <iostream.h>
#include <conio.h>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <dir.h>
#define blockCount 10
#define maxID 100
char *mainPath[blockCount];
char tempPath[] = "src.pdb";
char _template[]="tmp.pdb";
char dbDirectory[MAXDIR]="c:\\";
char indexPath[]="index.idb";
char keyTab = 1;
FILE *mainFile = NULL, *temFile = NULL, *infoFile=NULL;
int DBflag=0;
class animalRecord
{public:
int ID;
int Age;
char Pet[40+2];
char ownerName[40+2];
char Illness[40+2];
int Price;
char Notes[40+2];
int isSet;
int errorcode;
void readFromFile(FILE *CUR = NULL);
void writeToFile(FILE *CUR = NULL);
void goToKey(FILE *CUR = NULL);
animalRecord();};
animalRecord::animalRecord()
{ID = -1;
Age = 0;
strcpy (Pet,"NULL");
strcpy (ownerName,"NULL");
strcpy (Illness,"NULL");
Price = 0;
strcpy (Notes,"NULL");
errorcode = isSet = 0;}
void animalRecord::writeToFile(FILE* CUR)
{if (CUR == NULL) return;
fprintf(CUR,"%c\n%d\n%d\n%s\n%s\n%s\n%d\n%s\n",keyTab,
this->ID,
this->Age,
this->Pet,
this->ownerName,
this->Illness,
this->Price,
this->Notes);CUR=NULL;}
void animalRecord::readFromFile(FILE *CUR)
{animalRecord buf=animalRecord();
int eofflag=0, l, read=0;
char cbuf, key=0;
buf.isSet=0;
do
{if(feof(CUR))
{eofflag=1;break;}
fscanf(CUR,"%c",&key);}
while(key!=keyTab);
if(eofflag)
{if(!read)
{buf.errorcode=1;
*this = buf;
return;}}
//Reading record --------------------------------------------------------------
fscanf(CUR,"\n%d\n",&buf.ID);
fscanf(CUR,"%d\n",&buf.Age);
for(l=0, fscanf(CUR,"%c",&cbuf);cbuf!='\n';l++)
{buf.Pet[l]=cbuf;
fscanf(CUR,"%c",&cbuf);}
buf.Pet[l]='\0';
for(l=0, fscanf(CUR,"%c",&cbuf);cbuf!='\n';l++)
{buf.ownerName[l]=cbuf;
fscanf(CUR,"%c",&cbuf);}
buf.ownerName[l]='\0';
for(l=0, fscanf(CUR,"%c",&cbuf);cbuf!='\n';l++)
{buf.Illness[l]=cbuf;
fscanf(CUR,"%c",&cbuf);}
buf.Illness[l]='\0';
fscanf(CUR,"%d\n",&buf.Price);
for(l=0, fscanf(CUR,"%c",&cbuf);cbuf!='\n';l++)
{buf.Notes[l]=cbuf;
fscanf(CUR,"%c",&cbuf);}
buf.Notes[l]='\0';
buf.isSet=1;
*this = buf;}
void animalRecord::goToKey(FILE *CUR)
{int i=0,a;float ad;
char key;
if((ftell(CUR))>0)
fseek(CUR,-1,SEEK_CUR);
else{return;}
do
{ad = ftell(CUR);
fscanf(CUR,"%c",&key);
fseek(CUR,ad,SEEK_SET);
if(key=='\n')
a=-2;
else
a=-1;
fseek(CUR,a,SEEK_CUR);
}while(key!=keyTab);
fseek(CUR,1,SEEK_CUR);}
//------------------------------------------------------------------------------
void SetIndexFile();
int ChangeDir(char[MAXDIR]);
char* SetBlockName(int);
void FileGenerator();
int reccmp(char str1[47], char str2[47], int count);
void New();
void Open();
char* SetStr(int);
animalRecord Set (animalRecord set = animalRecord () );
void Insert (animalRecord sav = animalRecord () );
void Delete (animalRecord Del = animalRecord () );
void Modify ();
void Find ();
void Print ();
int main()
{textmode(64);
clrscr();
for(int i=0;i<blockCount;i++)
if (!(mainPath[i] = (char*) malloc(15)))
{exit(0);}
FileGenerator();
do
{cout<<"Main menu:";
cout<<"\n1. New base"<<
"\n2. Open base"<<
"\n3. Insert"<<
"\n4. Delete"<<
"\n5. Modify"<<
"\n6. Find"<<
"\n7. Print"<<
"\n8. Quit program\n"<<
"Your choise: ";
switch(getch())
{case '1': clrscr();New(); break;
...